package com.javaweb.annotation.validate;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import jakarta.validation.Constraint;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import jakarta.validation.Payload;

/**
 * 整型校验注解
 * @author tank2140896
 */
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=IntegerValueClass.class)
public @interface IntegerValueRange {

	/**
	 * 整型数值列表
	 * @return int[] 整型数值列表
	 */
	int[] vauleArray() default {};
	
	/**
	 * 是否允许空
	 * <p>
	 * 允许空时将不做校验，但是一旦不为空，将进行校验；不允许空时将做校验
	 * @return boolean true：允许空；false：不允许空
	 */
	boolean allowEmpty() default false;
	
	/* ↓↓↓↓↓↓↓↓↓↓严格模式下必须有↓↓↓↓↓↓↓↓↓↓ */
	/**
	 * 校验信息
	 * <p>
	 * 这里为全局通用参数校验失败信息
	 * @return String 校验信息
	 */
	String message() default "validated.check.fail";
	
	/**
	 * 组
	 * @return Class<?>[] 组
	 */
	Class<?>[] groups() default {};
	
	/**
	 * payload
	 * @return Class<? extends Payload>[] payload
	 */
	Class<? extends Payload>[] payload() default {};
	/* ↑↑↑↑↑↑↑↑↑↑严格模式下必须有↑↑↑↑↑↑↑↑↑↑ */
	
}

/**
 * 整型校验总处理类
 * @author tank2140896
 */
class IntegerValueClass implements ConstraintValidator<IntegerValueRange,Object> {
    
	/**
	 * 整型校验注解
	 */
	protected IntegerValueRange valueRange;
	
	/**
	 * 初始化
	 */
	@Override
	public void initialize(IntegerValueRange valueRange) {
		this.valueRange = valueRange;
	}

	/**
	 * 校验总方法
	 */
	@Override
	public boolean isValid(Object value,ConstraintValidatorContext context) {
		boolean allowEmpty = valueRange.allowEmpty();
		if(allowEmpty){
			if(value==null){
				return true;
			}
		}
		if(value!=null) {
			int checkValue = Integer.parseInt(String.valueOf(value));
			int[] valueArray = valueRange.vauleArray();
			if(valueArray==null||valueArray.length==0){
				return true;
			}
			for(int i=0;i<valueArray.length;i++){
				if(checkValue==valueArray[i]){
					return true;
				}
			}
		}
		return false;
	}
	
}
